package org.example.utils;

import org.springframework.beans.BeanUtils;

import java.util.ArrayList;
import java.util.List;

public class SpringBeanUtil {
    /**
     * 根据给定的源对象和目标类型，创建一个目标类型的实例，并将源对象的属性值复制到新实例中。
     *
     * @param source 源对象，其属性值将被复制。
     * @param target 目标类型的Class对象，用于创建新实例并复制属性值。
     * @return 一个新创建的目标类型的实例，其属性值已从源对象复制。
     * @throws RuntimeException 如果在创建目标实例或复制属性时发生异常。
     */
    public static <T> T copyProperties(Object source, Class<T> target) {
        try {
            // 创建目标类型的实例
            T t = target.getConstructor().newInstance();
            // 将源对象的属性值复制到目标对象
            BeanUtils.copyProperties(source, t);
            return t;
        } catch (Exception e) {
            // 抛出运行时异常，封装任何发生的异常
            throw new RuntimeException(e);
        }
    }

    /**
     * 将源列表中的对象属性复制到目标类型中，并返回一个新的目标类型列表。
     * 源列表中的每个对象都应能被转换为目标类型。
     *
     * @param sourceList 源对象列表，不约束对象类型，但每个对象应能被转换为目标类型。
     * @param target 目标类型的Class对象，用于指导对象的创建和属性复制。
     * @return 一个新的列表，其中包含源列表中每个对象转换为目标类型后的实例。
     */
    public static <T> List<T> copyProperties(List<?> sourceList, Class<T> target) {
        // 创建一个空的目标类型列表，用于存放转换后的对象
        ArrayList<T> targetList = new ArrayList<>();
        // 遍历源列表，为每个源对象创建一个目标类型的实例，并复制其属性
        sourceList.forEach(item -> targetList.add(copyProperties(item, target)));
        return targetList;
    }
}
